import pandas as pd
import matplotlib.pyplot as plt
import os
from datetime import datetime
import logging

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 可配置的列名 - 根据实际Excel文件调整
DATE_COLUMN = '创建时间'      # 日期列名
LOCATION_COLUMN = '发货地'   # 发货地列名
QUANTITY_COLUMN = '净重'     # 发货量列名


def main():
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 文件路径配置
    excel_path = r'c:\Users\HP\OneDrive\Desktop\所有文件\123\project黄飞燕\FhjlViewDD.xlsx'
    output_image = r'c:\Users\HP\OneDrive\Desktop\所有文件\123\project黄飞燕\june_location_shipment_pie.png'

    try:
        # 读取Excel数据
        logger.info(f'正在读取Excel文件: {excel_path}')
        df = pd.read_excel(excel_path, engine='openpyxl')
        logger.info(f'成功加载数据，共 {len(df)} 行记录')

        # 检查必要列是否存在
        required_columns = [DATE_COLUMN, LOCATION_COLUMN, QUANTITY_COLUMN]
        missing_columns = [col for col in required_columns if col not in df.columns]
        if missing_columns:
            available_columns = ', '.join(df.columns)
            raise ValueError(f"Excel文件缺少必要列: {missing_columns}。可用列有: {available_columns}。请检查并修改程序中的列名变量。")

        # 转换日期列并处理无效日期
        df[DATE_COLUMN] = pd.to_datetime(df[DATE_COLUMN], errors='coerce')
        valid_dates_df = df.dropna(subset=[DATE_COLUMN])
        invalid_dates_count = len(df) - len(valid_dates_df)
        if invalid_dates_count > 0:
            logger.warning(f'发现 {invalid_dates_count} 行无效日期数据，已自动过滤')
        df = valid_dates_df

        # 筛选6月份数据（当前年份）
        current_year = datetime.now().year
        df_june = df[(df[DATE_COLUMN].dt.year == current_year) & (df[DATE_COLUMN].dt.month == 6)]

        if len(df_june) == 0:
            logger.warning(f'未找到 {current_year} 年6月份的数据记录，尝试查找所有年份的6月份数据...')
            df_june = df[df[DATE_COLUMN].dt.month == 6]
            if len(df_june) == 0:
                raise ValueError('未找到任何年份的6月份数据记录，请检查日期列格式')
            current_year = '所有年份'

        logger.info(f'筛选出 {current_year} 年6月份数据共 {len(df_june)} 行')

        # 按发货地汇总发货总量
        location_summary = df_june.groupby(LOCATION_COLUMN)[QUANTITY_COLUMN].sum().reset_index()
        location_summary = location_summary.rename(columns={QUANTITY_COLUMN: '发货总量'})

        # 按发货量从大到小排序
        location_summary = location_summary.sort_values(by='发货总量', ascending=False)

        if location_summary.empty:
            raise ValueError('汇总后没有数据，请检查筛选条件和列名配置')

        # 绘制饼状图
        plt.figure(figsize=(10, 8))
        wedges, texts, autotexts = plt.pie(
            location_summary['发货总量'],
            labels=location_summary[LOCATION_COLUMN],
            autopct='%1.1f%%',
            startangle=90,
            wedgeprops={'edgecolor': 'white'}
        )

        # 设置文本样式
        plt.setp(autotexts, size=10, weight='bold')
        plt.title(f'{current_year}年6月份各发货地发货总量占比饼状图', fontsize=15)
        plt.axis('equal')  # 确保饼图是正圆形

        # 添加图例
        plt.legend(location_summary[LOCATION_COLUMN], title='发货地', loc='center left', bbox_to_anchor=(1, 0, 0.5, 1))

        # 保存图表
        plt.tight_layout()
        plt.savefig(output_image, dpi=300, bbox_inches='tight')
        logger.info(f'饼状图已保存至: {output_image}')
        plt.close()

        logger.info('发货地发货总量统计完成！')

    except FileNotFoundError:
        logger.error(f'错误：Excel文件不存在，请确认路径正确: {excel_path}')
    except PermissionError:
        logger.error(f'错误：没有权限访问文件，请确保文件未被占用且有权限读取: {excel_path}')
    except ValueError as ve:
        logger.error(f'数据处理错误: {ve}')
    except Exception as e:
        logger.error(f'发生未知错误: {str(e)}')

if __name__ == '__main__':
    main()